package study

import "fmt"

func init() {
	fmt.Printf("初始化 study 库\n")
	// --------------------------------------------------- go mod ---------------------------------------------------
	// go mod download  // 下载依赖包
	// go mod edit  // 工具或脚本编辑go.mod
	// go mod graph  // 打印模块依赖图
	// go mod init  // 在当前目录初始化 mod
	// go mod tidy  // 拉取缺少的模块，移除不用的模块。
	// go mod vendor  // 将依赖复制到 vendor下
	// go mod verify  // 验证依赖是否正确
	// go mod why  // 解释为什么需要依赖
	// go list -m -json all  // 依赖详情

	// --------------------------------------------------- go 标识符命名规则 ---------------------------------------------------
	// 1.大小写字母, 下划线, 数字组成
	// 2.不能以数字开头
	// 3.严格区分大小写
	// 4.不能包含空格
	// 5.下划线不能单独做标识符
	// 6.不能以关键字做标识符

	// --------------------------------------------------- 命名规范 ---------------------------------------------------
	// 1.package 包名 和父级目录尽量保持一致; 采用有意义的包名, 简短, 有意义, 不要和标准库冲突
	// 2.变量名, 函数名, 常量名采用驼峰规则
	// 3.变量名, 函数名, 常量首字母大写(大驼峰规则), 表示可以被其他包访问
	// 4.变量名, 函数名, 常量首字母小写(小驼峰规则), 只能在当前包内访问
	// --------------------------------------------------- 系统保留关键字(25个) ---------------------------------------------------
	// break      default        func     interface   select
	// case       defer          go       map         struct
	// chan       else           goto     package     switch
	// const      fallthrough    if       range       type
	// continue   for            import   return      var
	// --------------------------------------------------- 系统预定义标识符(36个)---------------------------------------------------
	// 系统预定义标识符包括基本数据类型和系统内嵌函数
	// append      bool           byte      cap      close     complex
	// complex63   complex128     uint16    copy     false     float32
	// float64     imag           int       int8     int16     uint32
	// int32       int64          iota      len      make      new
	// nil         panic          uint64    print    println   real
	// recover     string         true      uint     uint8     uintprt

	// --------------------------------------------------- 内存 ---------------------------------------------------
	// 堆                        栈
	// 引用类型                   值类型

	// 1.值类型都有对应的指针类型, 形式为 *数据类型; 如: int 对应的指针类型 *int
	// 2.值类型: 基本数据类型(int 系列, float 系列, bool, string), 数组, 结构体(struct) // 变量存的就是值, 也叫值类型
	//   2.1 值类型通常在 栈 中
	// 3.引用类型: 指针, 切片(slice), map, 管道(channel), interface 等
	//   3.1 引用类型通常在 堆 中

	// 1.基本数据类型: 变量存的就是值, 也叫值类型
	// 2.获取变量的地址用 &; 如: var i int 获取 i 的地址: &i
	// 3.指针类型: 变量存的是一个地址, 地址指向的空间才是值; 如: var ptr *int = &i
	// 4.获取指针类型所指向的值使用 *; 如: var ptr *int; 使用 *ptr 获取 ptr 指向的值

	// Printf 格式化输出
	// --------------------------------------------------- 通用占位符 ---------------------------------------------------
	// v      值的默认格式。
	// %+v    添加字段名(如结构体)
	// %#v    相应值的Go语法表示
	// %T     相应值的类型的Go语法表示
	// %%     字面上的百分号，并非值的占位符
	// --------------------------------------------------- 不同类型, %v 对应的不同格式 ---------------------------------------------------
	// bool:                    %t
	// int, int8 etc.:          %d
	// uint, uint8 etc.:        %d, %x if printed with %#v
	// float32, complex64, etc: %g
	// string:                  %s
	// chan:                    %p
	// pointer:                 %p
	// --------------------------------------------------- 布尔值 ---------------------------------------------------
	// %t     true 或 false
	// --------------------------------------------------- 整数值 ---------------------------------------------------
	// %b     二进制表示
	// %c     相应Unicode码点所表示的字符
	// %d     十进制表示
	// %o     八进制表示
	// %q     单引号围绕的字符字面值，由Go语法安全地转义
	// %x     十六进制表示，字母形式为小写 a-f
	// %X     十六进制表示，字母形式为大写 A-F
	// %U     Unicode格式：U+1234，等同于 "U+%04X"
	// --------------------------------------------------- 浮点数及复数 ---------------------------------------------------
	// %b     无小数部分的，指数为二的幂的科学计数法，与 strconv.FormatFloat中的 'b' 转换格式一致。例如 -123456p-78
	// %e     科学计数法，例如 -1234.456e+78
	// %E     科学计数法，例如 -1234.456E+78
	// %f     有小数点而无指数，例如 123.456
	// %g     根据情况选择 %e 或 %f 以产生更紧凑的（无末尾的0）输出
	// %G     根据情况选择 %E 或 %f 以产生更紧凑的（无末尾的0）输出
	// --------------------------------------------------- 字符串和 bytes 的 slice 表示 ---------------------------------------------------
	// %s     字符串或切片的无解译字节
	// %q     双引号围绕的字符串，由Go语法安全地转义
	// %x     十六进制，小写字母，每字节两个字符
	// %X     十六进制，大写字母，每字节两个字符
	// --------------------------------------------------- 指针 ---------------------------------------------------
	// %p     十六进制表示，前缀 0x
	// --------------------------------------------------- 对于复合对象 ---------------------------------------------------
	// struct:            {field0 field1 ...}
	// array, slice:      [elem0 elem1 ...]
	// maps:              map[key1:value1 key2:value2]
	// pointer to above:  &{}, &[], &map[]
	// --------------------------------------------------- 宽度和精度 ---------------------------------------------------
	// %f:      default width, default precision
	// %9f      width 9, default precision
	// %.2f     default width, precision 2
	// %9.2f    width 9, precision 2
	// %9.f     width 9, precision 0
	// --------------------------------------------------- 其他标志 ---------------------------------------------------
	// +     总打印数值的正负号；对于%q（%+q）保证只输出ASCII编码的字符。
	// -     左对齐
	// #     备用格式：为八进制添加前导 0（%#o），为十六进制添加前导 0x（%#x）或0X（%#X），为 %p（%#p）去掉前导 0x；对于 %q，若 strconv.CanBackquote 返回 true，就会打印原始（即反引号围绕的）字符串；如果是可打印字符，%U（%#U）会写出该字符的Unicode编码形式（如字符 x 会被打印成 U+0078 'x'）。
	// ' '  （空格）为数值中省略的正负号留出空白（% d）；以十六进制（% x, % X）打印字符串或切片时，在字节之间用空格隔开
	// 0     填充前导的0而非空格；对于数字，这会将填充移到正负号之后
}
